#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "freertos/task.h"
#include "user_gpio.h"
#include <inttypes.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TAG "GPIO Driver"

#define MODULE_POWER_EN GPIO_NUM_19

#define GPIO_INPUT_IO_0 21 // 设置 GPIO21 为输入引脚
#define ESP_INTR_FLAG_DEFAULT 0

static QueueHandle_t gpio_evt_queue = NULL;

// 中断服务例程
static void IRAM_ATTR gpio_isr_handler(void *arg) {
    uint32_t gpio_num = (uint32_t)arg;
    xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
}

// GPIO事件处理任务
static void gpio_task_example(void *arg) {
    uint32_t io_num;
    for (;;) {
        if (xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) {
            printf("GPIO[%" PRIu32 "] interrupt, value: %d\n", io_num, gpio_get_level(io_num));
        }
    }
}

// 初始化GPIO21为输入模式，并配置中断
void input_key_init(void) {
    // 配置GPIO21为输入，上拉输入，并设置上下沿触发中断
    gpio_config_t io_conf = {};
    io_conf.intr_type = GPIO_INTR_ANYEDGE;            // 上下沿中断
    io_conf.pin_bit_mask = (1ULL << GPIO_INPUT_IO_0); // 设置GPIO21
    io_conf.mode = GPIO_MODE_INPUT;                   // 输入模式
    io_conf.pull_up_en = GPIO_PULLUP_ENABLE;          // 启用上拉
    io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;     // 禁用下拉
    gpio_config(&io_conf);

    // 创建一个队列，用于处理GPIO中断事件
    gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));

    // 启动GPIO事件处理任务
    xTaskCreate(gpio_task_example, "gpio_task_example", 2048, NULL, 10, NULL);

    // 安装GPIO中断服务
    gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);

    // 为GPIO21添加ISR中断处理程序
    gpio_isr_handler_add(GPIO_INPUT_IO_0, gpio_isr_handler, (void *)GPIO_INPUT_IO_0);
}

// 初始化GPIO22为输出模式
void init_module_power(void) {
    gpio_config_t io_conf;
    io_conf.intr_type = GPIO_INTR_DISABLE;            // 无中断
    io_conf.pin_bit_mask = (1ULL << 18); // 设置控制电源的GPIO
    io_conf.mode = GPIO_MODE_OUTPUT;                  // 设置为输出模式
    io_conf.pull_up_en = GPIO_PULLUP_DISABLE;         // 禁用上拉电阻
    io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;     // 禁用下拉电阻
    gpio_config(&io_conf);                            // 配置GPIO

    io_conf.intr_type = GPIO_INTR_DISABLE;            // 无中断
    io_conf.pin_bit_mask = (1ULL << 19); // 设置控制电源的GPIO
    io_conf.mode = GPIO_MODE_OUTPUT;                  // 设置为输出模式
    io_conf.pull_up_en = GPIO_PULLUP_DISABLE;         // 禁用上拉电阻
    io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;     // 禁用下拉电阻
    gpio_config(&io_conf);                            // 配置GPIO
}

// 打开外接模块电源
void config_module_power(bool status) { 
    gpio_set_level(18, status); 
    gpio_set_level(19, status); 
}
    

// 关闭外接模块电源
void user_gpio_init(void) {
    init_module_power();
    while (1) {
        config_module_power(false);
        vTaskDelay(10 / portTICK_PERIOD_MS);
        config_module_power(true);
        vTaskDelay(10 / portTICK_PERIOD_MS);
    }
    // input_key_init();
    // bat_driver_init();
    // tp_driver_init();
}